package wef.PW.module.analysis;

import wef.PW.module.Initialization;
import wef.PW.module.command.Command;
import wef.PW.module.command.CommandImpl;
import wef.PW.module.model.APDU;
import wef.PW.utils.StrUtils;

public class RewardSortImpl implements RewardSort{

    private APDU apdu;
    private Command command;

    public RewardSortImpl(APDU apdu){
        this.apdu = apdu;
        this.command = new CommandImpl();
        rewardSort();
    }

    public void rewardSort(){

        // 判断控制域1第八位数组类型 区分
        String cldn1 = StrUtils.strPolish(Integer.toBinaryString(Integer.parseInt(apdu.getCLDN1(), 16)), 8);
        if (cldn1.substring(6, 8).equals("01")) SFormat();// S格式 // 第一个控制域第八位数组为01时为s格式 U格式为11 I格式为0
        if (cldn1.substring(6, 8).equals("11")) UFormat();// U格式
        if (cldn1.substring(7, 8).equals("0")) IFormat();// I格式
    }

    /**
     * S 格式报文处理
     */
    public void SFormat() {
        System.out.println("报文为 S 格式报文");
    }

    /**
     * U 格式报文处理
     */
    public void UFormat() {
        System.out.println("报文为 U 格式报文");
        String cldn1Binary = StrUtils.strPolish(Integer.toBinaryString(Integer.parseInt(apdu.getCLDN1(), 16)), 8); // 补齐八位
        switch (Integer.parseInt((cldn1Binary.substring(0, 2)))){ // TESTFR
            // 测试确认
            case 10:
                System.out.println("测试确认");
                Initialization.plcl.getRewardReceive().setState(true);
                return;
            // 测试生效 需要回复确认
            case 1:
                System.out.println("测试生效 需要回复确认");
                command.testCommand();
                return;
        }
        switch (Integer.parseInt((cldn1Binary.substring(2, 4)))){ // STOPDT
            case 10:
                System.out.println("停止确认");
                return;
            case 1:
                System.out.println("停止生效 需要回复确认");
                return;
        }

        switch (Integer.parseInt((cldn1Binary.substring(4, 6)))){ // STARTDT
            case 10:
                System.out.println("初始化确认");
                command.generalCallCommand(1);//发送总召唤
                return;
            case 1:
                System.out.println("初始化生效 需要回复确认");
                return;
        }
        System.out.println("无法解析改 U 格式报文");
    }

    /**
     * I 格式报文处理
     * 每次收到一个I 格式报文则接收序号加 1
     */
    public void IFormat() {

        System.out.println("报文为 I 格式报文");
        int receiveNum  = Initialization.plcl.getReceiveNum();
        Initialization.plcl.setReceiveNum(receiveNum + 1);
        System.out.println(Initialization.plcl.getReceiveNum());
        command.sRewardCommand();
        String typ = apdu.getAsdu().getTYP();
        String cot = apdu.getAsdu().getCOT();
        if (typ.equals("01")){
            System.out.println("单点信息");
            if (cot.equals("1400")){
                System.out.println("响应总召唤");
            }else if(cot.equals("0300")){
                System.out.println("(突发)");
            }

        }else if (typ.equals("09")){
            System.out.println("测量值，归一化值");
            if (cot.equals("1400")){
                System.out.println("响应总召唤");
            }else if(cot.equals("0300")){
                System.out.println("(突发)");
            }
        }
        System.out.println();
    }
}
